<!DOCTYPE html>
<html lang="en">
    <head>
            <meta charset="utf-8">
            <meta http-equiv="X-UA-Compatible" content="IE=edge">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <meta content="Bmob,BmobCloud,bomb,BaaS,mBaaS,PaaS,Serverless,FaaS,Function as a Service,Backend as a Service,serverless computing,cloud function,后端云,bmob后端云,小程序云,小程序后端,云数据库,云存储,文件存储,云函数,云端代码,定时任务,游戏后端,游戏云,用户系统,无服务器函数,移动开发,app开发,小程序开发,云端一体化,互联网中间件" name="keywords"/>
            <meta content="国内首家专注于移动应用Serverless云服务的平台,Bmob后端云让移动开发更简单,全方位一体化的后端服务平台" name="description"/>
            
            
            
            <link rel="shortcut icon" href="../../../img/favicon.ico">
        
        <script type="text/javascript" src="//game.bmob.cn/static/doc_union.js"></script>
            <!--
            <title>自动更新 - Bmob文档中心</title>
            -->
            <title>数据存储 &middot; Android – Bmob后端云 </title>        
            
            <link href="../../../css/bootstrap-custom.min.css" rel="stylesheet">
            <link href="../../../css/font-awesome-4.5.0.css" rel="stylesheet">
            <link href="../../../css/base.css" rel="stylesheet">
            <link rel="stylesheet" href="../../../css/highlight.css">
            <link href="../../../css/agate.css" rel="stylesheet">
            <link href="../../../css/custom.css" rel="stylesheet" id="custom">
    </head>

    <body >

        <div class="navbar navbar-fixed-top" role="navigation">
    <div class="main-nav">
        <!-- Collapsed navigation -->
        <div class="navbar-header">
            <a class="navbar-brand" href="../../..">
                <!--Bmob文档中心-->
                <img src="../../../img/logo.png" alt="">
            </a>
        </div>

        <!-- Expanded navigation -->
        <div class="navbar-collapse collapse">

          <ul class="nav navbar-nav">
            
              <li class="pull-left">
                
					<a href="../../..">文档首页</a>
                
              </li>
            
              <li class="pull-left active">
                
					<!--<a href="">数据服务</a>-->
					<li class="dropdown active">
                        <a href="#" class="dropdown-toggle" data-toggle="dropdown">数据服务 <b class="caret"></b></a>
                        <ul class="dropdown-menu">
                            
								<li class="active">
									<a href="../">Android</a>
                                </li>
                            
                            
								<li >
									<a href="../../ios/">iOS</a>
                                </li>
                            
                            
								<li >
									<a href="../../csharp/">C#</a>
                                </li>
                            
                            
								<li >
									<a href="../../php/">PHP</a>
                                </li>
                            
                            
								<li >
									<a href="../../go/">GO</a>
                                </li>
                            
                            
								<li >
									<a href="../../restful/">REST API</a>
                                </li>
                            
                            
								<li >
									<a href="../../wechat_app_new/rm/">JavaScript</a>
                                </li>
                            
                            
                                <li >
                                    <a href="../../cocos2d_x/">Cocos2D-X</a>
                                </li>
							
                            
								<li >
									<a href="../../wechat_app/">小程序</a>
                                </li>
                            
                            
                                <li >
                                    <a href="../../wechat_app_new/">快应用</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../wechat_app_new/">Nodejs</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../wechat_app_new/">Cocos Creator</a>
                                </li>
							
                            
								<li >
									<a href="../../wechat_app_new/rm/">小程序(新)</a>
                                </li>
                            
                            
                                <li >
                                    <a href="../../kotlin/">Kotlin</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../python/">Python</a>
                                </li>
							
                        </ul>
                    </li>
                
              </li>
            
              <li class="pull-left">
                
					<!--<a href="../../../cloud_function/android/">云函数</a>-->
					<li class="dropdown">
                        <a href="#" class="dropdown-toggle" data-toggle="dropdown">云函数 <b class="caret"></b></a>
                        <ul class="dropdown-menu">
                            
                                <li >
                                    <a href="../../../cloud_function/android/">Android</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../../cloud_function/ios/">iOS</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../../cloud_function/java/">Java</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../../cloud_function/python/">Python</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../../cloud_function/csharp/">C#</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../../cloud_function/php/">PHP</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../../cloud_function/javascript/">JavaScript</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../../cloud_function/restful/">REST API</a>
                                </li>
							
                            
								<li >
									<a href="../../../cloud_function/web/">Web</a>
                                </li>
                            
                        </ul>
                    </li>
                
              </li>
            
              <li class="pull-left">
                
					<!--<a href="../../../sms/android/">短信服务</a>-->
					<li class="dropdown">
                        <a href="#" class="dropdown-toggle" data-toggle="dropdown">短信服务 <b class="caret"></b></a>
                        <ul class="dropdown-menu">
                            
                                <li >
                                    <a href="../../../sms/android/">Android</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../../sms/ios/">iOS</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../../sms/php/">PHP</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../../sms/javascript/">JavaScript</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../../sms/restful/">REST API</a>
                                </li>
							
                        </ul>
                    </li>
                
              </li>
            
              <li class="pull-left">
                
					<!--<a href="">游戏实时后端</a>-->
					<li class="dropdown">
                        <a href="#" class="dropdown-toggle" data-toggle="dropdown">游戏实时后端 <b class="caret"></b></a>
                        <ul class="dropdown-menu">
                            
								<li >
									<a href="../../../game/unity/quick_start/">Unity</a>
                                </li>
                            
                            
								<li >
									<a href="../../../game/cocos_creator/quick_start/">Cocos Creator</a>
                                </li>
                            
                            
								<li >
									<a href="../../../game/wechat_games/quick_start/">微信小游戏</a>
                                </li>
                            
                            
                                <li >
                                    <a href="../../../game/cloud_function/develop_doc/">云函数</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../../game/classic_case/">经典案例</a>
                                </li>
							
                        </ul>
                    </li>
                
              </li>
            
              <li class="pull-left">
                
					<!--<a href="">即时通讯</a>-->
					<li class="dropdown">
                        <a href="#" class="dropdown-toggle" data-toggle="dropdown">即时通讯 <b class="caret"></b></a>
                        <ul class="dropdown-menu">
                            
								<li >
									<a href="../../../im/android/">Android</a>
                                </li>
                            
                            
								<li >
									<a href="../../../im/ios/">iOS</a>
                                </li>
                            
                        </ul>
                    </li>
                
              </li>
            
              <li class="pull-left">
                
					<!--<a href="../../../push/android/">推送服务</a>-->
					<li class="dropdown">
                        <a href="#" class="dropdown-toggle" data-toggle="dropdown">推送服务 <b class="caret"></b></a>
                        <ul class="dropdown-menu">
                            
                                <li >
                                    <a href="../../../push/android/">Android</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../../push/ios/">iOS</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../../push/php/">PHP</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../../push/javascript/">JavaScript</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../../push/restful/">REST API</a>
                                </li>
							
                        </ul>
                    </li>
                
              </li>
            
              <li class="pull-left">
                
					<!--<a href="../../../other/common_problem/">其他</a>-->
					<li class="dropdown">
                        <a href="#" class="dropdown-toggle" data-toggle="dropdown">其他 <b class="caret"></b></a>
                        <ul class="dropdown-menu">
                            
                                <li >
                                    <a href="../../../other/common_problem/">常见问题</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../../other/error_code/">错误码</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../../other/data_safety/">数据安全</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../../other/bql/">BQL</a>
                                </li>
							
                        </ul>
                    </li>
                
              </li>
            
              <li>
                  <a href="https://www.bmob.cn/repository/index" target="_blank">知识库</a>
              </li>
              <li>
                  <a href="http://doc.bmob.cn/video/index.html" target="_blank">视频教程</a>
              </li>
            </ul>
            
        </div>
    </div>
</div>

        <div class="pagebody" id="main-wrapper">
            <div class="sidebar">
                <div class="bs-sidebar hidden-print affix well" role="complementary">

	
		
	
		
				
					<div class="code-title">Android</div>
				
				
				
				
				
				
				
				
				
				
				
				
				
				
				
		
	
		
				
				
				
				
				
				
				
				
				
		
	
		
				
				
				
				
				
		
	
		
				
				
				
				
				
		
	
		
				
				
		
	
		
				
				
				
				
				
		
	
		
				
				
				
				
		
	


	<ul class="nav bs-sidenav">
		
			
		
			
				
					
						
							
								
									<li class="">
										<a class="itm-l1" href="../">快速入门</a>
										
									</li>
								
									<li class="">
										<a class="itm-l1" href="../develop_doc/">开发文档</a>
										
									</li>
								
									<li class="">
										<a class="itm-l1" href="../example/">示例/功能</a>
										
									</li>
								
									<li class="active">
										<a class="itm-l1" href="./">自动更新</a>
										
										<ul class="nav">
											
											<li class="active "><a href="#_1">快速入门</a>
												
												<ul class="nav nav-l2">
													<li><a class="itm-l2" href="#1">1、添加资源文件</a></li>
												</ul>
												
												<ul class="nav nav-l2">
													<li><a class="itm-l2" href="#2androidmanifestxml">2、配置AndroidManifest.xml</a></li>
												</ul>
												
												<ul class="nav nav-l2">
													<li><a class="itm-l2" href="#3appversion">3、初始化AppVersion表</a></li>
												</ul>
												
												<ul class="nav nav-l2">
													<li><a class="itm-l2" href="#4">4、调用自动更新接口</a></li>
												</ul>
												
												<ul class="nav nav-l2">
													<li><a class="itm-l2" href="#5apkapkurl">5、上传APK文件或填写apk文件的url地址</a></li>
												</ul>
												
												<ul class="nav nav-l2">
													<li><a class="itm-l2" href="#6">6、集成检测</a></li>
												</ul>
												
											</li>
												
											<li class=""><a href="#android70">兼容Android7.0</a>
												
												<ul class="nav nav-l2">
													<li><a class="itm-l2" href="#1-androidmanifestxmlapplication">1 在AndroidManifest.xml中的Application标签下添加如下内容：</a></li>
												</ul>
												
												<ul class="nav nav-l2">
													<li><a class="itm-l2" href="#2-resxmlfile_pathsxmlapk">2 在res的xml目录下创建file_paths.xml文件，用来指定Apk文件下载的位置，参考如下：</a></li>
												</ul>
												
											</li>
												
											<li class=""><a href="#_4">其他更新方式</a>
												
												<ul class="nav nav-l2">
													<li><a class="itm-l2" href="#_5">手动更新</a></li>
												</ul>
												
												<ul class="nav nav-l2">
													<li><a class="itm-l2" href="#_6">静默下载更新</a></li>
												</ul>
												
											</li>
												
											<li class=""><a href="#_7">自定义功能</a>
												
												<ul class="nav nav-l2">
													<li><a class="itm-l2" href="#_8">恢复默认设置</a></li>
												</ul>
												
												<ul class="nav nav-l2">
													<li><a class="itm-l2" href="#_9">设置更新的网络条件</a></li>
												</ul>
												
												<ul class="nav nav-l2">
													<li><a class="itm-l2" href="#_10">监听检测更新的结果</a></li>
												</ul>
												
												<ul class="nav nav-l2">
													<li><a class="itm-l2" href="#_11">监听对话框按键操作</a></li>
												</ul>
												
											</li>
												
											<li class=""><a href="#_12">常见问题</a>
												
											</li>
												
										</ul>
										
									</li>
								
									<li class="">
										<a class="itm-l1" href="../class_doc/">类库文档</a>
										
									</li>
								
									<li class="">
										<a class="itm-l1" href="../update_log/">更新日志</a>
										
									</li>
								
							
						
					
						
					
						
					
						
					
						
					
						
					
						
					
						
					
						
					
						
					
						
					
						
					
						
					
						
					
						
					
				
			
		
			
		
			
		
			
		
			
		
			
		
			
		
	</ul>
</div>
            </div>
            <div class="content" role="main">
                <div class="wrap">
                    

<h2 id="_1">快速入门<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h2>
<h3 id="1">1、添加资源文件<a class="headerlink" href="#1" title="Permanent link">&para;</a></h3>
<p>下载SDK提供的res文件夹拷入工程目录下，和工程本身res目录合并。</p>
<p>res文件夹下载地址：<a href="https://www.bmob.cn/static/res.zip">https://www.bmob.cn/static/res.zip</a></p>
<p>这里需要注意的是：</p>
<ol>
<li>请不要随便删除其中的文件。</li>
<li>BmobSDK提供的资源文件都以bmob_开头。</li>
<li>如果是在AndroidStudio中用远程依赖的方式就可以跳过这个步骤，因为这些资源都在下载到本地的aar包中。</li>
</ol>
<h3 id="2androidmanifestxml">2、配置AndroidManifest.xml<a class="headerlink" href="#2androidmanifestxml" title="Permanent link">&para;</a></h3>
<p>1.打开AndroidManifest.xml，添加SDK需要的权限到<manifest>标签下：</p>
<pre><code class="xml">&lt;uses-permission android:name=&quot;android.permission.WRITE_EXTERNAL_STORAGE&quot;&gt;&lt;/uses-permission&gt;
&lt;uses-permission android:name=&quot;android.permission.ACCESS_NETWORK_STATE&quot;&gt;&lt;/uses-permission&gt;
&lt;uses-permission android:name=&quot;android.permission.INTERNET&quot;&gt;&lt;/uses-permission&gt;
&lt;uses-permission android:name=&quot;android.permission.REQUEST_INSTALL_PACKAGES&quot;&gt;&lt;/uses-permission&gt;
</code></pre>

<p>说明：
- android.permission.WRITE_EXTERNAL_STORAGE 权限允许将下载的apk保存到sd卡中。
- android.permission.ACCESS_NETWORK_STATE 权限允许检查网络状态，从而根据不同网络环境决定何种下载策略,务必添加该权限。
- android.permission.REQUEST_INSTALL_PACKAGES 权限适配Android8.0的安装权限管理</p>
<p>2.添加渠道到<application>标签下： </p>
<pre><code class="xml">&lt;meta-data android:value=&quot;Channel ID&quot; android:name=&quot;BMOB_CHANNEL&quot;/&gt;
</code></pre>

<p>说明：<code>BMOB_CHANNEL</code>用来标注应用推广渠道，不同渠道可以上传不同更新包，您可以使用20位以内的英文和数字为渠道定名，替换value中的<code>Channel ID</code>。如果不添加，将不区分渠道。(注意不要出现在manifest中标识了渠道但后端控制台没写渠道值，这样是无法自动更新的，因为没匹配上)</p>
<p>3.添加Activity到<application>标签下：</p>
<pre><code class="xml">&lt;activity 
            android:name=&quot;cn.bmob.v3.update.UpdateDialogActivity&quot;
            android:theme=&quot;@android:style/Theme.Translucent.NoTitleBar&quot; &gt;
        &lt;/activity&gt;
</code></pre>

<h3 id="3appversion">3、初始化AppVersion表<a class="headerlink" href="#3appversion" title="Permanent link">&para;</a></h3>
<p>一行代码轻松搞定<code>AppVersion</code>表（<strong>注意：请务必将该表在WEB端设置为只读模式</strong>）：</p>
<p>SDK提供了初始化自动创建<code>AppVersion</code>表的方法，不再需要开发者手动在web端创建。只需要在你使用自动更新功能的地方调用如下代码：</p>
<pre><code class="java">    BmobUpdateAgent.initAppVersion();
</code></pre>

<p><strong>注：</strong></p>
<p><strong>1、initAppVersion方法适合开发者调试自动更新功能时使用，一旦AppVersion表在后台创建成功，建议屏蔽或删除此方法，否则会生成多行记录。</strong></p>
<p><strong>2、如果调用了此方法后，在管理后台没有看见AppVersion表生成，建议到手机的应用管理界面<code>清除该应用的数据，并再次调用该方法</code>，也可到LogCat中查看与<code>bmob</code>相关错误日志。</strong></p>
<p><strong>3、如果<code>2</code>方法尝试多次之后仍然无效，请<code>手动创建AppVersion表</code>，表的各个字段名称请查看下表。</strong></p>
<h3 id="4">4、调用自动更新接口<a class="headerlink" href="#4" title="Permanent link">&para;</a></h3>
<p>最常见的自动更新模式是：当用户进入应用首页后，如果处于wifi环境则检测更新，如果有更新，弹出对话框提示有新版本，用户点选更新开始下载更新。实现的方法是，在应用程序入口Activity里的<code>OnCreate()</code>方法中调用如下代码：</p>
<pre><code class="java">public void onCreate(Bundle  savedInstanceState) {
    super.onCreate(savedInstanceState);
    BmobUpdateAgent.update(this);
}
</code></pre>

<ol>
<li>考虑到用户流量的限制，目前我们默认在WiFi接入情况下才进行自动提醒。如需要在任意网络环境下都进行更新自动提醒，则请在update调用之前添加以下代码：</li>
</ol>
<pre><code class="java">BmobUpdateAgent.setUpdateOnlyWifi(false)
</code></pre>

<ol>
<li>如果你发现调用update方法无反应，可使用下面<code>自定义功能</code>中的<code>监听检测更新的结果</code>提到的方法来监听自动更新的结果,具体如下：</li>
</ol>
<pre><code class="java">BmobUpdateAgent.setUpdateListener(new BmobUpdateListener() {

    @Override
    public void onUpdateReturned(int updateStatus, UpdateResponse updateInfo) {
        // TODO Auto-generated method stub
        //根据updateStatus来判断更新是否成功
    }
})
</code></pre>

<h4 id="_2">强制更新<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h4>
<p>应用场景：如果应用需要屏蔽旧版本，强制用户必须更新升级到最新版才能继续使用。</p>
<p>SDK中为自动更新方式提供了<code>强制更新</code>功能，当开发者开启强制更新功能（即将后台的<code>AppVersion</code>表中的isforce字段置为true）时，客户端调用<code>BmobUpdateAgent.update(context)</code>方法后，更新对话框只保留“立即更新”按钮且不再支持回退操作。其效果图如下：</p>
<p><img alt="" src="../image/force.png" /></p>
<h4 id="_3">忽略版本更新<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h4>
<p>SDK中为自动更新方式提供了<code>忽略版本更新</code>功能，当用户勾选”忽略该版“选项时，再次调用<code>BmobUpdateAgent.update(context)</code>则不再出现版本更新对话框。</p>
<p><strong>注：强制更新和忽略版本更新只支持自动更新方式。</strong></p>
<h3 id="5apkapkurl">5、上传APK文件或填写apk文件的url地址<a class="headerlink" href="#5apkapkurl" title="Permanent link">&para;</a></h3>
<p>初始化AppVersion表成功后，开发者在管理后台的<code>数据浏览</code>页中就可以看见AppVersion表了,该表的结构如下：</p>
<table>
<thead>
<tr>
<th align="left">字段名称</th>
<th align="left">字段类型</th>
<th align="left">是否必填</th>
<th align="left">字段说明</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">update_log</td>
<td align="left">String</td>
<td align="left">是</td>
<td align="left">更新日志</td>
</tr>
<tr>
<td align="left">version</td>
<td align="left">String</td>
<td align="left">是</td>
<td align="left">版本名称</td>
</tr>
<tr>
<td align="left">version_i</td>
<td align="left">Number</td>
<td align="left">是</td>
<td align="left">版本号</td>
</tr>
<tr>
<td align="left">platform</td>
<td align="left">String</td>
<td align="left">是</td>
<td align="left">平台，注意："Android"为安卓平台标示，"ios"为ios平台标示</td>
</tr>
<tr>
<td align="left">target_size</td>
<td align="left">String</td>
<td align="left">是</td>
<td align="left">Apk文件大小</td>
</tr>
<tr>
<td align="left">isforce</td>
<td align="left">Boolean</td>
<td align="left">否</td>
<td align="left">是否强制更新</td>
</tr>
<tr>
<td align="left">path</td>
<td align="left">File</td>
<td align="left">是/否</td>
<td align="left">Apk文件</td>
</tr>
<tr>
<td align="left">android_url</td>
<td align="left">String</td>
<td align="left">是/否</td>
<td align="left">apk市场地址（path字段和本字段必填其中一个）</td>
</tr>
<tr>
<td align="left">channel</td>
<td align="left">String</td>
<td align="left">否</td>
<td align="left">渠道标示</td>
</tr>
<tr>
<td align="left">ios_url</td>
<td align="left">String</td>
<td align="left">否</td>
<td align="left">iOS app store地址（如果是ios记录一定要填写）</td>
</tr>
</tbody>
</table>
<p>创建好这个表结构之后就可以新增一些记录，把应用的信息和下载地址（或者上传文件）填写上去，如下图所示：</p>
<p><img alt="" src="../image/table.jpg" /></p>
<p><strong>注：</strong></p>
<p><strong>1、target_size为必填项，是为了解决当apk下载过程中切换网络导致的解析包出现错误问题，请手动填入apk文件的字节大小。可通过鼠标右键apk文件--&gt;属性--&gt;大小（不是占用空间）获取到的target_size值（不需要单位）：</strong></p>
<p><img alt="" src="../image/target_size.png" /></p>
<p>如上例，只需要在<code>target_size</code>字段中填写<code>5032788</code>就行。</p>
<p><strong>2、新添加的数据记录的version_i（对应应用中的version code，如下图）的数值要大于手机中安装的应用的version number，否则无法生效。另外，platform需要根据实际情况填写平台信息。</strong></p>
<p><img alt="" src="../image/versioncode.jpg" /></p>
<p><strong>3、新版SDKV3.3.2调用initAppVersion方法后，你会看到AppVersion表的path字段有一个test.apk的文件，其实这个文件是个空的文件，不必过于纠结，将test.apk删除后再上传自己的apk文件即可。</strong></p>
<p><strong>4、新版SDKV3.3.4允许下载已上传到应用市场上的apk文件，因此，path和android_url两者填任意一个即可，若都填写，默认优先下载path字段下的apk文件。</strong></p>
<p><strong>5、新版SDKV3.3.4新增对update_log字段内容进行文字排版的功能，只需要在分段处加上分隔符<code>；</code>即可（UI效果如下图）</strong></p>
<p>具体格式参考如下范例：1、修复第三方登陆成功后无法获取本地用户信息的问题<code>；</code>2、修复设置缓存策略后无法获取本地缓存信息的问题<code>；</code>3、修复调用云端逻辑（callEndpoint）方法的成功回调的返回值中含有“results”的问题<code>；</code>4、新版文件管理中对本地缩略图的处理方法新增压缩质量的参数。</p>
<p><img alt="" src="../image/update.png" /></p>
<p><strong>6、如果在web后台上传apk文件，然后在使用了v3.4.6之前版本的sdk的应用上调用自动更新功能出现 <code>解析包出错</code> 的问题，解决方法如下：</strong></p>
<p><strong>请不要上传apk文件到<code>path</code>字段，改为<code>填写apk文件的url地址</code>到<code>android_url</code>字段。</strong></p>
<p>具体原因请查看 <a href="http://doc.bmob.cn/other/common_problem/">常见问题</a>。</p>
<h3 id="6">6、集成检测<a class="headerlink" href="#6" title="Permanent link">&para;</a></h3>
<p>SDK中默认开启了集成检测功能，在调用任意的更新接口后，我们将替您自动检查上述集成过程中2、3两个步骤是否被正确完成。 如果正确完成不会出现任何提示，否则会以如下的toast提示您。</p>
<p>你可以通过调用<code>BmobUpdateAgent.setUpdateCheckConfig(false)</code>来禁用此功能。</p>
<p>toast的含义如下：</p>
<pre><code>"Please copy all resources (res/) from SDK to your project!"：请检查是不是把res文件夹下所有的资源文件都放到了工程中。

"Please add Permission in AndroidManifest!"：请检查上述步骤中的相关权限是否正确添加。

"Please add Activity in AndroidManifest!"：请检查上述步骤中的Activity是否正确添加。
</code></pre>
<h2 id="android70">兼容Android7.0<a class="headerlink" href="#android70" title="Permanent link">&para;</a></h2>
<p>兼容了Android7.0中的FileProvider，具体用法如下：</p>
<h3 id="1-androidmanifestxmlapplication">1 在AndroidManifest.xml中的Application标签下添加如下内容：<a class="headerlink" href="#1-androidmanifestxmlapplication" title="Permanent link">&para;</a></h3>
<pre><code class="xml">&lt;provider
    android:name=&quot;android.support.v4.content.FileProvider&quot;
    android:authorities=&quot;此处填写你应用的包名&quot;
    android:exported=&quot;false&quot;
    android:grantUriPermissions=&quot;true&quot;&gt;
    &lt;meta-data
        android:name=&quot;android.support.FILE_PROVIDER_PATHS&quot;
        android:resource=&quot;@xml/file_paths&quot; /&gt;
&lt;/provider&gt;

</code></pre>

<h3 id="2-resxmlfile_pathsxmlapk">2 在res的xml目录下创建file_paths.xml文件，用来指定Apk文件下载的位置，参考如下：<a class="headerlink" href="#2-resxmlfile_pathsxmlapk" title="Permanent link">&para;</a></h3>
<pre><code class="xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;paths&gt;
    &lt;external-path name=&quot;Download&quot; path=&quot;Download&quot;/&gt;
&lt;/paths&gt;
</code></pre>

<h2 id="_4">其他更新方式<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h2>
<p>除了在快速入门中提到的自动更新之外，Bmob自动更新SDK还支持另外两种场景：手动更新、静默更新。
下面将详细介绍这两种场景的接口及默认行为。</p>
<h3 id="_5">手动更新<a class="headerlink" href="#_5" title="Permanent link">&para;</a></h3>
<p>许多应用的设置界面中都会有检查更新等类似功能，需要用户主动触发而检测更新。它的默认行为基本和自动更新基本一致。它和自动更新的主要区别是：在这种手动更新的情况下，无论网络状况是否Wifi，无论用户是否忽略过该版本的更新，都可以像下面的示例一样在按钮的回调中发起更新检查，代替update(Context context)：</p>
<pre><code>public void onClick(View v) {
    BmobUpdateAgent.forceUpdate(mContext);
}
</code></pre>
<h3 id="_6">静默下载更新<a class="headerlink" href="#_6" title="Permanent link">&para;</a></h3>
<p>当用户进入应用首页后如果处于wifi环境检测更新，如果有更新，后台下载新版本，如果下载成功，则进行通知栏展示，用户点击通知栏开始安装。静默下载过程中如果wifi断开，则会停止下载。实现的方法是：在应用程序入口Activity里的<code>OnCreate()</code>方法中调用如下代码：</p>
<pre><code>public void onCreate(Bundle  savedInstanceState) {
    super.onCreate(savedInstanceState);
    BmobUpdateAgent.silentUpdate(this);
}
</code></pre>
<h2 id="_7">自定义功能<a class="headerlink" href="#_7" title="Permanent link">&para;</a></h2>
<h3 id="_8">恢复默认设置<a class="headerlink" href="#_8" title="Permanent link">&para;</a></h3>
<p>BmobUpdateAgent.setDefault();</p>
<h3 id="_9">设置更新的网络条件<a class="headerlink" href="#_9" title="Permanent link">&para;</a></h3>
<p>BmobUpdateAgent.setUpdateOnlyWifi（boolean updateOnlyWifi）</p>
<p>注：updateOnlyWifi:true表示只在wifi环境下检测更新，false表示所有环境下均可检测更新</p>
<h3 id="_10">监听检测更新的结果<a class="headerlink" href="#_10" title="Permanent link">&para;</a></h3>
<p>如果开发者想自己处理检测更新的结果，可以按如下步骤，实现更新监听接口，自主处理更新事件：</p>
<pre><code class="java">    BmobUpdateAgent.setUpdateListener(new BmobUpdateListener() {

        @Override
        public void onUpdateReturned(int updateStatus, UpdateResponse updateInfo) {
            // TODO Auto-generated method stub
            if (updateStatus == UpdateStatus.Yes) {//版本有更新

            }else if(updateStatus == UpdateStatus.No){
                Toast.makeText(ActAutoUpdate.this, &quot;版本无更新&quot;, Toast.LENGTH_SHORT).show();
            }else if(updateStatus==UpdateStatus.EmptyField){//此提示只是提醒开发者关注那些必填项，测试成功后，无需对用户提示
                Toast.makeText(ActAutoUpdate.this, &quot;请检查你AppVersion表的必填项，1、target_size（文件大小）是否填写；2、path或者android_url两者必填其中一项。&quot;, Toast.LENGTH_SHORT).show();
            }else if(updateStatus==UpdateStatus.IGNORED){
                Toast.makeText(ActAutoUpdate.this, &quot;该版本已被忽略更新&quot;, Toast.LENGTH_SHORT).show();
            }else if(updateStatus==UpdateStatus.ErrorSizeFormat){
                Toast.makeText(ActAutoUpdate.this, &quot;请检查target_size填写的格式，请使用file.length()方法获取apk大小。&quot;, Toast.LENGTH_SHORT).show();
            }else if(updateStatus==UpdateStatus.TimeOut){
                Toast.makeText(ActAutoUpdate.this, &quot;查询出错或查询超时&quot;, Toast.LENGTH_SHORT).show();
            }
        }
    });
    //发起自动更新
    BmobUpdateAgent.update(this);
</code></pre>

<h3 id="_11">监听对话框按键操作<a class="headerlink" href="#_11" title="Permanent link">&para;</a></h3>
<p>有时候开发者需要知道用户点击了哪个按钮，开发者可设置监听对话框的按钮点击事件。</p>
<pre><code class="java">    //设置对对话框按钮的点击事件的监听
    BmobUpdateAgent.setDialogListener(new BmobDialogButtonListener() {

        @Override
        public void onClick(int status) {
            // TODO Auto-generated method stub
            switch (status) {
            case UpdateStatus.Update:
                Toast.makeText(ActAutoUpdate.this, &quot;点击了立即更新按钮&quot; , Toast.LENGTH_SHORT).show();
                break;
            case UpdateStatus.NotNow:
                Toast.makeText(ActAutoUpdate.this, &quot;点击了以后再说按钮&quot; , Toast.LENGTH_SHORT).show();
                break;
            case UpdateStatus.Close://只有在强制更新状态下才会在更新对话框的右上方出现close按钮,如果用户不点击”立即更新“按钮，这时候开发者可做些操作，比如直接退出应用等
                Toast.makeText(ActAutoUpdate.this, &quot;点击了对话框关闭按钮&quot; , Toast.LENGTH_SHORT).show();
                break;
            }
        }
    });
</code></pre>

<p><strong>注：UpdateStatus列表</strong></p>
<pre><code>UpdateStatus.TimeOut    =-1：查询出错或超时
UpdateStatus.Yes        = 0：有更新
UpdateStatus.No         = 1：没有更新
UpdateStatus.IGNORED    = 3：该版本已被忽略更新
UpdateStatus.EmptyField = 2：字段值为空，请检查以下内容：
                            1)、是否已填写target_size目标apk大小（以字节为单位）；
                            2)、path或者android_url两者是否必填其中一项（若两者都填写，则默认下载path字段下的apk文件）
UpdateStatus.ErrorSizeFormat = 4：请检查target_size填写的格式，请使用file.length()方法获取apk大小
UpdateStatus.Update     =6： 代表点击的是“立即更新”
UpdateStatus.NotNow     =7： 代表点击的是“以后再说”
UpdateStatus.Close      =8： 代表关闭对话框--&gt;只有在强制更新状态下才会在更新对话框的右上方出现close按钮,如果用户不点击”立即更新“按钮，这时候开发者可做些操作，比如直接退出应用等
</code></pre>
<h2 id="_12">常见问题<a class="headerlink" href="#_12" title="Permanent link">&para;</a></h2>
<p>一、<strong>上传新的APK文件之后，为什么使用 <code>v3.4.6以前版本的SDK开发的旧应用</code> 的自动更新功能出现<code>解析包出错</code>问题？</strong></p>
<p>1、表现：</p>
<pre><code>只下载58字节后就弹出安装界面，点击安装出现`解析包出错`的错误。
</code></pre>
<p>2、原因：</p>
<pre><code> 自4月13日上线CDN文件服务以来，通过Web后台上传的apk文件都会自动上传到CDN服务提供商那里，而`v3.4.6以前版本的SDK`的自动更新功能中得到`用于下载的url地址会将Bmob原有的文件域名拼接到BmobFile的url前面`。

因此，最终拼接成的用于下载的地址是类似这样的：`http://file.bmob.cn/http://bmob-cdn-82.b0.upaiyun.com/2016/04/20/xxx.apk`，由此导致 `解析包出错`。
</code></pre>
<p>3、解决方法：</p>
<pre><code>不要上传apk文件到`AppVersion`表的`path`字段，改为填写url地址到`AppVersion`表的`android_url`字段，以此来恢复旧应用的自动更新功能。
</code></pre>
<p>其中，<code>android_url</code>可以是以下两种之一：</p>
<pre><code>1）、`各大应用市场的应用下载地址`
2）、`上传新的apk文件到bmob的其他表的文件字段中，然后通过getFileUrl(context)获取到的url地址`
</code></pre>
<p><strong>注：如果是新发布的应用(使用BmobV3.4.6后的版本开发的应用)，则仍然可以上传apk文件到<code>AppVersion</code>表的<code>path</code>字段中。</strong></p>
<p>二、 <strong>为什么调用<code>BmobUpdateAgent.update(this)</code>方法后没有弹出更新对话框？</strong></p>
<p>请仔细检查以下几方面：</p>
<pre><code>1）、如果是通过`手动方法`在后台创建的AppVersion表的话，则仔细对照文档检查各个字段的名称是否正确填写，注意大小写;

2）、`AndroidManifest.xml`中的的`android:versionCode`的值是否比后台的`AppVersion`表中填写的`version_i`的值`小`;

3）、`target_size`的值是否正确填写，填写的是apk的字节大小，没有单位，例如：很多开发者填写的是'x.xxM',这个格式是错误的;

4)、`AndroidManifest.xml`中的`BMOB_CHANNEL`的值是否和后台的`AppVersion`表中填写的`channel`的值`相等`。

 &lt;!-- 设置应用渠道，如果应用不需要区分渠道，则建议删除此行 --&gt;
&lt;meta-data android:name="BMOB_CHANNEL" android:value="bmob"/&gt;
</code></pre>
                </div>
            </div>
        </div>

        
            <script>var base_url = '../../..';</script>
            <script src="../../../js/jquery-1.10.2.min.js"></script>
            <script src="../../../js/bootstrap-3.0.3.min.js"></script>
            <script src="../../../js/highlight.pack.js"></script>
            <script src="../../../js/main.js"></script>
            <script src="../../../js/base.js"></script>

        <div id="go-top"><i class="fa fa-chevron-up"></i></div>
        <a href="https://docs.bmob.cn/data/Android/a_faststart/doc/index.html" id="back" target="_blank">返回 <br> 旧版</a>
    </body>

</html>